//+------------------------------------------------------------------+
//|                                                   TimeSeries.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "Series.h"
#include <Arrays/ArrayInt.mqh>
#include <Arrays/ArrayLong.mqh>
#include <Arrays/ArrayDatetime.mqh>

//+------------------------------------------------------------------+
//| 价格序列基类                                                     |
//| 用途：价格序列的基类                                             |
//|         继承自 CSeries 类                                        |
//+------------------------------------------------------------------+
class CPriceSeries : public CSeries
{
public:
   /** 构造函数 */
   CPriceSeries(void);
   
   /** 析构函数 */
   ~CPriceSeries(void);
   
   /**
    * 调整缓冲区大小
    * @param size 新的大小
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      BufferResize(const int size);
   
   /**
    * 查找最小值索引
    * @param start 起始位置
    * @param count 数量
    * @return 最小值索引
    */
   virtual int       MinIndex(const int start, const int count) const;
   
   /**
    * 查找最小值
    * @param start 起始位置
    * @param count 数量
    * @param index 输出最小值索引
    * @return 最小值
    */
   virtual double    MinValue(const int start, const int count, int &index) const;
   
   /**
    * 查找最大值索引
    * @param start 起始位置
    * @param count 数量
    * @return 最大值索引
    */
   virtual int       MaxIndex(const int start, const int count) const;
   
   /**
    * 查找最大值
    * @param start 起始位置
    * @param count 数量
    * @param index 输出最大值索引
    * @return 最大值
    */
   virtual double    MaxValue(const int start, const int count, int &index) const;
   
   /**
    * 获取数据值
    * @param index 索引位置
    * @return 数据值
    */
   double            GetData(const int index) const;
   
   /**
    * 刷新数据
    * @param flags 刷新标志
    */
   virtual void      Refresh(const int flags = OBJ_ALL_PERIODS);
};

//+------------------------------------------------------------------+
//| 开盘价缓冲区类                                                   |
//| 用途：开盘价序列缓冲区                                           |
//|         继承自 CDoubleBuffer 类                                 |
//+------------------------------------------------------------------+
class COpenBuffer : public CDoubleBuffer
{
public:
   /** 构造函数 */
   COpenBuffer(void);
   
   /** 析构函数 */
   ~COpenBuffer(void);
   
   /** 刷新缓冲区数据 */
   virtual bool      Refresh(void);
   
   /** 刷新当前缓冲区数据 */
   virtual bool      RefreshCurrent(void);
};

//+------------------------------------------------------------------+
//| 开盘价序列类                                                     |
//| 用途：开盘价序列                                                 |
//|         继承自 CPriceSeries 类                                  |
//+------------------------------------------------------------------+
class CiOpen : public CPriceSeries
{
public:
   /** 构造函数 */
   CiOpen(void);
   
   /** 析构函数 */
   ~CiOpen(void);
   
   /**
    * 创建序列
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 获取数据值
    * @param index 索引位置
    * @return 数据值
    */
   double            GetData(const int index) const;
   
   /**
    * 获取数据（通过起始位置和数量）
    * @param start_pos 起始位置
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const int start_pos, const int count, double &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和数量）
    * @param start_time 起始时间
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const int count, double &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和结束时间）
    * @param start_time 起始时间
    * @param stop_time 结束时间
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const datetime stop_time, double &buffer[]) const;
};

//+------------------------------------------------------------------+
//| 最高价缓冲区类                                                   |
//| 用途：最高价序列缓冲区                                           |
//|         继承自 CDoubleBuffer 类                                 |
//+------------------------------------------------------------------+
class CHighBuffer : public CDoubleBuffer
{
public:
   /** 构造函数 */
   CHighBuffer(void);
   
   /** 析构函数 */
   ~CHighBuffer(void);
   
   /** 刷新缓冲区数据 */
   virtual bool      Refresh(void);
   
   /** 刷新当前缓冲区数据 */
   virtual bool      RefreshCurrent(void);
};

//+------------------------------------------------------------------+
//| 最高价序列类                                                     |
//| 用途：最高价序列                                                 |
//|         继承自 CPriceSeries 类                                  |
//+------------------------------------------------------------------+
class CiHigh : public CPriceSeries
{
public:
   /** 构造函数 */
   CiHigh(void);
   
   /** 析构函数 */
   ~CiHigh(void);
   
   /**
    * 创建序列
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 获取数据值
    * @param index 索引位置
    * @return 数据值
    */
   double            GetData(const int index) const;
   
   /**
    * 获取数据（通过起始位置和数量）
    * @param start_pos 起始位置
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const int start_pos, const int count, double &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和数量）
    * @param start_time 起始时间
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const int count, double &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和结束时间）
    * @param start_time 起始时间
    * @param stop_time 结束时间
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const datetime stop_time, double &buffer[]) const;
};

//+------------------------------------------------------------------+
//| 最低价缓冲区类                                                   |
//| 用途：最低价序列缓冲区                                           |
//|         继承自 CDoubleBuffer 类                                 |
//+------------------------------------------------------------------+
class CLowBuffer : public CDoubleBuffer
{
public:
   /** 构造函数 */
   CLowBuffer(void);
   
   /** 析构函数 */
   ~CLowBuffer(void);
   
   /** 刷新缓冲区数据 */
   virtual bool      Refresh(void);
   
   /** 刷新当前缓冲区数据 */
   virtual bool      RefreshCurrent(void);
};

//+------------------------------------------------------------------+
//| 最低价序列类                                                     |
//| 用途：最低价序列                                                 |
//|         继承自 CPriceSeries 类                                  |
//+------------------------------------------------------------------+
class CiLow : public CPriceSeries
{
public:
   /** 构造函数 */
   CiLow(void);
   
   /** 析构函数 */
   ~CiLow(void);
   
   /**
    * 创建序列
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 获取数据值
    * @param index 索引位置
    * @return 数据值
    */
   double            GetData(const int index) const;
   
   /**
    * 获取数据（通过起始位置和数量）
    * @param start_pos 起始位置
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const int start_pos, const int count, double &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和数量）
    * @param start_time 起始时间
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const int count, double &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和结束时间）
    * @param start_time 起始时间
    * @param stop_time 结束时间
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const datetime stop_time, double &buffer[]) const;
};

//+------------------------------------------------------------------+
//| 收盘价缓冲区类                                                   |
//| 用途：收盘价序列缓冲区                                           |
//|         继承自 CDoubleBuffer 类                                 |
//+------------------------------------------------------------------+
class CCloseBuffer : public CDoubleBuffer
{
public:
   /** 构造函数 */
   CCloseBuffer(void);
   
   /** 析构函数 */
   ~CCloseBuffer(void);
   
   /** 刷新缓冲区数据 */
   virtual bool      Refresh(void);
   
   /** 刷新当前缓冲区数据 */
   virtual bool      RefreshCurrent(void);
};

//+------------------------------------------------------------------+
//| 收盘价序列类                                                     |
//| 用途：收盘价序列                                                 |
//|         继承自 CPriceSeries 类                                  |
//+------------------------------------------------------------------+
class CiClose : public CPriceSeries
{
public:
   /** 构造函数 */
   CiClose(void);
   
   /** 析构函数 */
   ~CiClose(void);
   
   /**
    * 创建序列
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 获取数据值
    * @param index 索引位置
    * @return 数据值
    */
   double            GetData(const int index) const;
   
   /**
    * 获取数据（通过起始位置和数量）
    * @param start_pos 起始位置
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const int start_pos, const int count, double &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和数量）
    * @param start_time 起始时间
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const int count, double &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和结束时间）
    * @param start_time 起始时间
    * @param stop_time 结束时间
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const datetime stop_time, double &buffer[]) const;
};

//+------------------------------------------------------------------+
//| 点差缓冲区类                                                     |
//| 用途：点差序列缓冲区                                             |
//|         继承自 CArrayInt 类                                     |
//+------------------------------------------------------------------+
class CSpreadBuffer : public CArrayInt
{
protected:
   string            m_symbol;           // 交易品种
   ENUM_TIMEFRAMES   m_period;           // 时间周期
   int               m_freshed_data;     // 已刷新数据数量
   int               m_size;             // 使用的历史数据大小

public:
   /** 构造函数 */
   CSpreadBuffer(void);
   
   /** 析构函数 */
   ~CSpreadBuffer(void);
   
   /** 设置缓冲区大小 */
   void              Size(const int size);
   
   /**
    * 访问指定位置的数据
    * @param index 索引位置
    * @return 数据值
    */
   int               At(const int index) const;
   
   /** 刷新缓冲区数据 */
   virtual bool      Refresh(void);
   
   /** 刷新当前缓冲区数据 */
   virtual bool      RefreshCurrent(void);
   
   /**
    * 设置交易品种和时间周期
    * @param symbol 交易品种名称
    * @param period 时间周期
    */
   void              SetSymbolPeriod(const string symbol, const ENUM_TIMEFRAMES period);
};

//+------------------------------------------------------------------+
//| 点差序列类                                                       |
//| 用途：点差序列                                                   |
//|         继承自 CSeries 类                                        |
//+------------------------------------------------------------------+
class CiSpread : public CSeries
{
public:
   /** 构造函数 */
   CiSpread(void);
   
   /** 析构函数 */
   ~CiSpread(void);
   
   /**
    * 创建序列
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 调整缓冲区大小
    * @param size 新的大小
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      BufferResize(const int size);
   
   /**
    * 获取数据值
    * @param index 索引位置
    * @return 数据值
    */
   int               GetData(const int index) const;
   
   /**
    * 获取数据（通过起始位置和数量）
    * @param start_pos 起始位置
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const int start_pos, const int count, int &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和数量）
    * @param start_time 起始时间
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const int count, int &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和结束时间）
    * @param start_time 起始时间
    * @param stop_time 结束时间
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const datetime stop_time, int &buffer[]) const;
   
   /**
    * 刷新数据
    * @param flags 刷新标志
    */
   virtual void      Refresh(const int flags = OBJ_ALL_PERIODS);
};

//+------------------------------------------------------------------+
//| 时间缓冲区类                                                     |
//| 用途：时间序列缓冲区                                             |
//|         继承自 CArrayDatetime 类                                |
//+------------------------------------------------------------------+
class CTimeBuffer : public CArrayDatetime
{
protected:
   string            m_symbol;           // 交易品种
   ENUM_TIMEFRAMES   m_period;           // 时间周期
   int               m_freshed_data;     // 已刷新数据数量
   int               m_size;             // 使用的历史数据大小

public:
   /** 构造函数 */
   CTimeBuffer(void);
   
   /** 析构函数 */
   ~CTimeBuffer(void);
   
   /** 设置缓冲区大小 */
   void              Size(const int size);
   
   /**
    * 访问指定位置的数据
    * @param index 索引位置
    * @return 数据值
    */
   datetime          At(const int index) const;
   
   /** 刷新缓冲区数据 */
   virtual bool      Refresh(void);
   
   /** 刷新当前缓冲区数据 */
   virtual bool      RefreshCurrent(void);
   
   /**
    * 设置交易品种和时间周期
    * @param symbol 交易品种名称
    * @param period 时间周期
    */
   void              SetSymbolPeriod(const string symbol, const ENUM_TIMEFRAMES period);
};

//+------------------------------------------------------------------+
//| 时间序列类                                                       |
//| 用途：时间序列                                                   |
//|         继承自 CSeries 类                                        |
//+------------------------------------------------------------------+
class CiTime : public CSeries
{
public:
   /** 构造函数 */
   CiTime(void);
   
   /** 析构函数 */
   ~CiTime(void);
   
   /**
    * 创建序列
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 调整缓冲区大小
    * @param size 新的大小
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      BufferResize(const int size);
   
   /**
    * 获取数据值
    * @param index 索引位置
    * @return 数据值
    */
   datetime          GetData(const int index) const;
   
   /**
    * 获取数据（通过起始位置和数量）
    * @param start_pos 起始位置
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const int start_pos, const int count, datetime &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和数量）
    * @param start_time 起始时间
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const int count, datetime &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和结束时间）
    * @param start_time 起始时间
    * @param stop_time 结束时间
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const datetime stop_time, datetime &buffer[]) const;
   
   /**
    * 刷新数据
    * @param flags 刷新标志
    */
   virtual void      Refresh(const int flags = OBJ_ALL_PERIODS);
};

//+------------------------------------------------------------------+
//| 成交量缓冲区类                                                   |
//| 用途：成交量序列缓冲区                                           |
//|         继承自 CArrayLong 类                                     |
//+------------------------------------------------------------------+
class CTickVolumeBuffer : public CArrayLong
{
protected:
   string            m_symbol;           // 交易品种
   ENUM_TIMEFRAMES   m_period;           // 时间周期
   int               m_freshed_data;     // 已刷新数据数量
   int               m_size;             // 使用的历史数据大小

public:
   /** 构造函数 */
   CTickVolumeBuffer(void);
   
   /** 析构函数 */
   ~CTickVolumeBuffer(void);
   
   /** 设置缓冲区大小 */
   void              Size(const int size);
   
   /**
    * 访问指定位置的数据
    * @param index 索引位置
    * @return 数据值
    */
   long              At(const int index) const;
   
   /** 刷新缓冲区数据 */
   virtual bool      Refresh(void);
   
   /** 刷新当前缓冲区数据 */
   virtual bool      RefreshCurrent(void);
   
   /**
    * 设置交易品种和时间周期
    * @param symbol 交易品种名称
    * @param period 时间周期
    */
   void              SetSymbolPeriod(const string symbol, const ENUM_TIMEFRAMES period);
};

//+------------------------------------------------------------------+
//| 成交量序列类                                                     |
//| 用途：成交量序列                                                 |
//|         继承自 CSeries 类                                        |
//+------------------------------------------------------------------+
class CiTickVolume : public CSeries
{
public:
   /** 构造函数 */
   CiTickVolume(void);
   
   /** 析构函数 */
   ~CiTickVolume(void);
   
   /**
    * 创建序列
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 调整缓冲区大小
    * @param size 新的大小
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      BufferResize(const int size);
   
   /**
    * 获取数据值
    * @param index 索引位置
    * @return 数据值
    */
   long              GetData(const int index) const;
   
   /**
    * 获取数据（通过起始位置和数量）
    * @param start_pos 起始位置
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const int start_pos, const int count, long &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和数量）
    * @param start_time 起始时间
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const int count, long &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和结束时间）
    * @param start_time 起始时间
    * @param stop_time 结束时间
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const datetime stop_time, long &buffer[]) const;
   
   /**
    * 刷新数据
    * @param flags 刷新标志
    */
   virtual void      Refresh(const int flags = OBJ_ALL_PERIODS);
};

//+------------------------------------------------------------------+
//| 实际成交量缓冲区类                                               |
//| 用途：实际成交量序列缓冲区                                       |
//|         继承自 CArrayLong 类                                     |
//+------------------------------------------------------------------+
class CRealVolumeBuffer : public CArrayLong
{
protected:
   string            m_symbol;           // 交易品种
   ENUM_TIMEFRAMES   m_period;           // 时间周期
   int               m_freshed_data;     // 已刷新数据数量
   int               m_size;             // 使用的历史数据大小

public:
   /** 构造函数 */
   CRealVolumeBuffer(void);
   
   /** 析构函数 */
   ~CRealVolumeBuffer(void);
   
   /** 设置缓冲区大小 */
   void              Size(const int size);
   
   /**
    * 访问指定位置的数据
    * @param index 索引位置
    * @return 数据值
    */
   long              At(const int index) const;
   
   /** 刷新缓冲区数据 */
   virtual bool      Refresh(void);
   
   /** 刷新当前缓冲区数据 */
   virtual bool      RefreshCurrent(void);
   
   /**
    * 设置交易品种和时间周期
    * @param symbol 交易品种名称
    * @param period 时间周期
    */
   void              SetSymbolPeriod(const string symbol, const ENUM_TIMEFRAMES period);
};

//+------------------------------------------------------------------+
//| 实际成交量序列类                                                 |
//| 用途：实际成交量序列                                             |
//|         继承自 CSeries 类                                        |
//+------------------------------------------------------------------+
class CiRealVolume : public CSeries
{
public:
   /** 构造函数 */
   CiRealVolume(void);
   
   /** 析构函数 */
   ~CiRealVolume(void);
   
   /**
    * 创建序列
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool              Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 调整缓冲区大小
    * @param size 新的大小
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      BufferResize(const int size);
   
   /**
    * 获取数据值
    * @param index 索引位置
    * @return 数据值
    */
   long              GetData(const int index) const;
   
   /**
    * 获取数据（通过起始位置和数量）
    * @param start_pos 起始位置
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const int start_pos, const int count, long &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和数量）
    * @param start_time 起始时间
    * @param count 数量
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const int count, long &buffer[]) const;
   
   /**
    * 获取数据（通过起始时间和结束时间）
    * @param start_time 起始时间
    * @param stop_time 结束时间
    * @param buffer 输出缓冲区
    * @return 复制的数据数量
    */
   int               GetData(const datetime start_time, const datetime stop_time, long &buffer[]) const;
   
   /**
    * 刷新数据
    * @param flags 刷新标志
    */
   virtual void      Refresh(const int flags = OBJ_ALL_PERIODS);
};
//+------------------------------------------------------------------+